package com.voxel.sense.infomsg.utils.manager;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.text.TextUtils;

import com.voxel.sense.infomsg.R;
import com.voxel.sense.infomsg.view.MyChartMarker;
import com.github.mikephil.charting.animation.Easing;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.IValueFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import com.github.mikephil.charting.utils.ViewPortHandler;

import java.util.ArrayList;


/**
 * 图表折线管理器
 */
public class LineChartManager {

    private static String lineName = null;
    private static String lineName1 = null;
    private static float yMax;

    /**
     * @param context    上下文
     * @param mLineChart 折线图控件
     * @param yValue     折线在y轴的值
     * @Description:创建两条折线
     */
    public static void initSingleLineChart(Context context, LineChart mLineChart,
                                           ArrayList<Entry> yValue) {
        //初始化图标样式
        initDataStyle(context, mLineChart);

        //初始化线的数据并设置折线的样式
        LineDataSet dataSet = getLineDataSet(context, yValue);
        ArrayList<ILineDataSet> dataSets = new ArrayList<>();
        dataSets.add(dataSet);
        //构建一个LineData  将dataSets放入
        LineData lineData = new LineData(dataSets);
        //将数据插入
        mLineChart.setData(lineData);
        mLineChart.setScaleEnabled(true);   // 两个轴上的缩放,X,Y分别默认为true
        mLineChart.setTouchEnabled(true);//触摸事件
//        mLineChart.setPinchZoom(true);//y，x轴同时缩放
        //点击数据点后显示的窗口
        mLineChart.setMarker(new MyChartMarker(context, R.layout.marker_chart));

        //设置动画效果
//        mLineChart.animateY(1500, Easing.EasingOption.Linear);
//        mLineChart.animateX(1500, Easing.EasingOption.Linear);
        mLineChart.invalidate();
    }

    @NonNull
    private static LineDataSet getLineDataSet(Context context, ArrayList<Entry> yValue) {
        LineDataSet dataSet = new LineDataSet(yValue, lineName);
        Resources resources = context.getResources();
        dataSet.setColor(resources.getColor(R.color.chart_line_grey));//折线颜色
        dataSet.setCircleColor(context.getResources().getColor(R.color.ring_color));//点的设置圆环颜色
        dataSet.setCircleColorHole(context.getResources().getColor(R.color.yellowDark));//点的设置圆心颜色
        dataSet.setDrawValues(false); //显示每个点的值
        dataSet.setValueTextSize(10);
        //设置坐标点的值的格式
        dataSet.setValueFormatter(new IValueFormatter() {
            @Override
            public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                String[] str = (String[]) entry.getData();
                if (!TextUtils.isEmpty(str[0])) {
                    return str[0];
                }
                return value + "";
            }
        });

        //将第一个dataSet的数据用左Y轴来描述
//        dataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
        dataSet.setDrawHighlightIndicators(true); // 画高亮指示器,默认true
        dataSet.setHighlightEnabled(true);  // 能否高亮,默认true
        return dataSet;
    }

    /**
     * @param context    上下文
     * @param mLineChart 折线图控件
     * @param xValues    折线在x轴的值
     * @param yValue     折线在y轴的值
     * @param yValue1    另一条折线在y轴的值
     * @Description:创建两条折线
     */
    public static void initDoubleLineChart(Context context, LineChart mLineChart, ArrayList<String> xValues,
                                           ArrayList<Entry> yValue, ArrayList<Entry> yValue1) {

        initDataStyle(context, mLineChart);

        LineDataSet dataSet = new LineDataSet(yValue, lineName);
        dataSet.setColor(Color.RED);
        dataSet.setCircleColor(Color.RED);
        dataSet.setDrawValues(false);

        LineDataSet dataSet1 = new LineDataSet(yValue1, lineName1);
        dataSet1.enableDashedLine(10f, 10f, 0f);//将折线设置为曲线
        dataSet1.setColor(Color.parseColor("#66CDAA"));
        dataSet1.setCircleColor(Color.parseColor("#66CDAA"));
        dataSet1.setDrawValues(false);
        yMax = dataSet1.getYMax();
        //构建一个类型为LineDataSet的ArrayList 用来存放所有 y的LineDataSet   他是构建最终加入LineChart数据集所需要的参数
        ArrayList<ILineDataSet> dataSets = new ArrayList<>();

        //将数据加入dataSets
        dataSets.add(dataSet);
        dataSets.add(dataSet1);

        //构建一个LineData  将dataSets放入
//        LineData lineData = new LineData(xValues, dataSets);
        LineData lineData = new LineData(dataSets);
        //将数据插入
        mLineChart.setData(lineData);
        //设置动画效果
        mLineChart.animateY(2000, Easing.EasingOption.Linear);
        mLineChart.animateX(2000, Easing.EasingOption.Linear);
        mLineChart.invalidate();
    }

    /**
     * @param context
     * @param mLineChart
     * @Description:初始化图表的样式
     */
    private static void initDataStyle(Context context, LineChart mLineChart) {
        Resources resources = context.getResources();
        //设置图表是否支持触控操作
        mLineChart.setTouchEnabled(true);
        mLineChart.setScaleEnabled(false);
        //设置点击折线点时，显示其数值
//        MyMakerView mv = new MyMakerView(context, R.layout.item_mark_layout);
//        mLineChart.setMarkerView(mv);
        //设置折线的描述的样式（默认在图表的左下角）
        Legend title = mLineChart.getLegend();
        title.setForm(Legend.LegendForm.LINE);
        //设置x轴的样式
        XAxis xAxis = mLineChart.getXAxis();
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setAxisLineColor(resources.getColor(R.color.chart_line_grey));
        xAxis.setAxisLineWidth(2);
        // 是否绘制网格线，默认true
        xAxis.setDrawGridLines(false);
//         //重置已经设置的最大值，自动匹配最大值
        xAxis.setSpaceMax(2);
        xAxis.setAxisMaximum(24);
        //设定该属性后，坐标拉伸时，不会出现其它的拉伸点，避免有多位小数值的点出现
        xAxis.setGranularityEnabled(true);
        //x轴值转换器
        xAxis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                axis.getSpaceMax();

                if (axis.getAxisMaximum() == value) {
                    return value + "h";
                }

                return (int) value + "";
            }
        });
        //设置是否显示x轴
        xAxis.setEnabled(true);

        //设置左边y轴的样式
        YAxis yAxisLeft = mLineChart.getAxisLeft();
        yAxisLeft.setAxisLineColor(resources.getColor(R.color.chart_line_grey));
        yAxisLeft.setAxisLineWidth(2);
        yAxisLeft.setDrawGridLines(false);

        //警戒线
//        LimitLine ll = new LimitLine(200f, "警戒线");//线条颜色宽度等
//        ll.setLineColor(resources.getColor(R.color.red_a100));
//        ll.setLineWidth(1);
//        yAxisLeft.addLimitLine(ll);
        //y轴值转换器
        //设置右边y轴的样式
        YAxis yAxisRight = mLineChart.getAxisRight();
        yAxisRight.setEnabled(false);


    }

    /**
     * @param name
     * @Description:设置折线的名称
     */
    public static void setLineName(String name) {
        lineName = name;
    }

    /**
     * @param name
     * @Description:设置另一条折线的名称
     */
    public static void setLineName1(String name) {
        lineName1 = name;
    }
}
